package com.rc.saas.tenant.interceptor;

import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * SPM拦截器
 * Created by Sven on 2021/02/19
 */
public class SpmInterceptor  extends HandlerInterceptorAdapter {
    private static Logger logger = LogManager.getLogger(SpmInterceptor.class);

    /**
     * 该方法将在请求处理之前进行调用
     * preHandle：拦截于请求刚进入时，进行判断，需要boolean返回值，如果返回true将继续执行，如果返回false，将不进行执行。一般用于登录校验
     * 1.当preHandle方法返回false时，从当前拦截器往回执行所有拦截器的afterCompletion方法，再退出拦截器链。也就是说，请求不继续往下传了，直接沿着来的链往回跑。
     * 2.当preHandle方法全为true时，执行下一个拦截器,直到所有拦截器执行完。再运行被拦截的Controller。然后进入拦截器链，运行所有拦截器的postHandle方法,完后从最后一个拦截器往回执行所有拦截器的afterCompletion方法.
     * @param request  请求
     * @param response 响应
     * @param handler  操作
     * @return true继续进入下一个拦截器的preHandle方法或者进入对应的Controller方法，false终止请求
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //如果不是映射到方法直接通过
        //ResourceHttpRequestHandler ["classpath:/static/", "classpath:/view/", "classpath:/public/", "classpath:/resources/", "classpath:/META-INF/resources/", "/"]
        if (!(handler instanceof HandlerMethod)) {
            return true;
        }

        String url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getServletPath();
        logger.info("preHandle:{}", url);

        //获取spm值并保存到会话中
        String spm = request.getParameter("spm");
        logger.warn("preHandle,spm:{}", spm);
        if (StringUtils.isNotBlank(spm)) {
            request.getSession().setAttribute("spm", spm);
        }else{
            //request.getSession().removeAttribute("spm");
            //request.getSession().setAttribute("spm", null);
        }

        return super.preHandle(request, response, handler);
    }
}
